




// 在外层循环中加入flag量进行判断——若本轮遍历没有发生任何一次交换，则终止循环。

function bubbleSort(_arr){
    //为了不影响原数组，进行拷贝
    let arr = [..._arr]
    // 如果数组元素 <=1，没有必要排序，直接返回
    if(arr.length <= 1){
        return arr
    }
    let flag = true
    for (let i = 0, len = arr.length; i < len; i++) {
        for (let j = 0, len = arr.length - i - 1; j < len; j++) {
            if (arr[j] > arr[j + 1]) {
                flag = false
                let temp = arr[j + 1]
                arr[j + 1] = arr[j]
                arr[j] = temp
            }
            console.log(i+'-'+j+'-: '+arr.toString())
        }
        if(flag){
           break;
        }
    }
    return arr
}

// 对于已经排好的情况，如果没有在这个判断，则两个for循环仍然会全部跑一次，如果有flag判断，则只跑一次外层for
let arr = [1,2,3,4,5]
bubbleSort(arr)